package com.itlzh.mall.user.JWTtest;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.junit.Test;

import java.util.Date;
import java.util.HashMap;

public class demo {
    @Test
    public void testBuild(){
        /**
         * 使用Jwts工具类生成JWT令牌
         * builder方法用于生成令牌
         * signWith方法用于设置签名，参数为签名算法和密钥
         * 该方法的参数放在令牌的header部分中，密钥可以为字符串，也可以是二进制数据
         * 该二进制数据应当是基于base64编码的密钥
         *
         * addClaims方法用于添加数据，参数为Map集合
         * 该map集合用于存放自定义数据数据，数据通过加密后会存放在令牌的payload部分中
         *
         * setExpiration方法用于设置令牌过期时间，参数为Date类型,在构造器中输入单位为毫秒的参数，为令牌设置令牌过期时间
         *
         * compact方法用于生成令牌，返回值为String类型
         *
         */
        HashMap<String, Object> dataMap = new HashMap<>();
        dataMap.put("id", 1);
        dataMap.put("name", "lzh");
        String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256, "aXRsemg=")
                .addClaims(dataMap)
                .setExpiration(new Date(System.currentTimeMillis() + 10 * 1000))
                .compact();
        System.out.println(jwt);
    }

    /**
     * 解析JWT令牌
     *
     * setSigningKey方法用于设置密钥，参数为密钥
     * parseClaimsJws方法用于解析JWT令牌，参数为JWT令牌，返回值为Claims对象
     * getBody方法用于获取JWT令牌中的数据，返回值为Claims对象
     *
     * Jwt令牌的signature部分是由header部分和payload部分加密生成的，
     * 加密的算法为header中指定的算法
     * 若前两部分被篡改了，计算出来的signature部分必定与原先的不同，就会报错
     *
     *
     *若令牌解析失败有3种原因：
     * 1、jwt被篡改
     * 2、令牌失效
     * 3、密钥错误
     */
    @Test
    public void testParser(){
        Claims claims = Jwts.parser().setSigningKey("aXRsemg=")
                .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoibHpoIiwiaWQiOjEsImV4cCI6MTc0OTc4NDIyMH0.yzYv9PYOZUg79CWRgMD_2mcDfVpRFEDUxAznY-nK7wI")
                .getBody();
        System.out.println(claims);
    }

}
